home *** CD-ROM | disk | FTP | other *** search
- program TstHshRM;
-
- {$IFDEF Win32}
- {$APPTYPE CONSOLE}
- {$ENDIF}
-
- uses
- {$IFDEF Windows}
- WinCrt,
- {$ENDIF}
- SysUtils,
- HashRecM;
-
- type
- TTestRecord = packed record
- Name : string[31];
- Ext : longint;
- end;
-
- function CalcELFHash(const S : string) : longint; far;
- var
- G : longint;
- i : integer;
- begin
- Result := 0;
- for i := 1 to length(S) do begin
- Result := (Result shl 4) + ord(S[i]);
- G := Result and $F0000000;
- if (G <> 0) then
- Result := Result xor (G shr 24);
- Result := Result and (not G);
- end;
- end;
-
- function GetKey(const aRecord) : string; far;
- begin
- Result := TTestRecord(aRecord).Name;
- end;
-
- const
- TPEmployees : array [0..32] of string[15] =
- ('Antypas', 'Bolduc', 'Brady',
- 'Bucknall', 'Cappellucci', 'Cope',
- 'DelRossi', 'Douglas', 'Fairweather',
- 'Foley', 'Frerking', 'Geiger',
- 'Ghinaudo', 'Horaz', 'Huffman',
- 'Hughes', 'Inman', 'Kokkonen',
- 'Larsen', 'Leier', 'Medlin',
- 'Milner', 'Phillips', 'Reisdorph',
- 'Roberts', 'Rogers', 'Rose',
- 'Salisbury', 'Trickey', 'Troxell',
- 'Turner', 'Warner', 'Welch');
-
- var
- i, j : longint;
- Database : ThrmHashRecordManager;
- SaveRandSeed : longint;
- MyRec : TTestRecord;
- Name : string[31];
-
- begin
- if FileExists('TEST.HTD') then DeleteFile('TEST.HTD');
- Database := ThrmHashRecordManager.Create('TEST', sizeof(TTestRecord), 2039, CalcELFHash, GetKey);
- try
- {add all employee names}
- for i := 0 to 32 do begin
- FillChar(MyRec, sizeof(MyRec), 0);
- MyRec.Name := TPEmployees[i];
- MyRec.Ext := 12300 + i;
- Database.Insert(MyRec);
- end;
- finally
- Database.Free;
- end;
- readln;
- Database := ThrmHashRecordManager.Create('TEST', sizeof(TTestRecord), 0, CalcELFHash, GetKey);
- try
- {get all employee names}
- for i := 0 to 32 do begin
- if Database.Find(TPEmployees[i], MyRec) then
- writeln(MyRec.Name)
- else begin
- writeln('***NOT FOUND***', TPEmployees[i]);
- readln;
- end;
- end;
- {delete the first ten employee names}
- for i := 0 to 9 do
- Database.Delete(TPEmployees[i]);
- {get all remaining employee names}
- for i := 10 to 32 do begin
- if Database.Find(TPEmployees[i], MyRec) then
- writeln(MyRec.Name)
- else begin
- writeln('***NOT FOUND***', TPEmployees[i]);
- readln;
- end;
- end;
- finally
- Database.Free;
- end;
- readln;
- Database := ThrmHashRecordManager.Create('TEST', sizeof(TTestRecord), 0, CalcELFHash, GetKey);
- try
- {add the first ten employee names back in reverse order}
- for i := 9 downto 0 do begin
- FillChar(MyRec, sizeof(MyRec), 0);
- MyRec.Name := TPEmployees[i];
- MyRec.Ext := 1200 + i;
- Database.Insert(MyRec);
- end;
- {get all employee names}
- for i := 0 to 32 do begin
- if Database.Find(TPEmployees[i], MyRec) then
- writeln(MyRec.Name)
- else begin
- writeln('***NOT FOUND***', TPEmployees[i]);
- readln;
- end;
- end;
- finally
- Database.Free;
- end;
- readln;
- Database := ThrmHashRecordManager.Create('TEST', sizeof(TTestRecord), 0, CalcELFHash, GetKey);
- try
- writeln('add 50000 random names');
- SaveRandSeed := RandSeed;
- for i := 0 to 49999 do begin
- FillChar(MyRec, sizeof(MyRec), 0);
- MyRec.Name[0] := #10;
- for j := 1 to 10 do
- MyRec.Name[j] := char(random(26) + ord('A'));
- MyRec.Ext := 900000 + i;
- Database.Insert(MyRec);
- end;
- writeln('read 50000 random names');
- RandSeed := SaveRandSeed;
- for i := 0 to 49999 do begin
- Name[0] := #10;
- for j := 1 to 10 do
- Name[j] := char(random(26) + ord('A'));
- if not Database.Find(Name, MyRec) then begin
- writeln('***NOT FOUND***', Name);
- readln;
- end;
- end;
- writeln('get all employee names');
- for i := 0 to 32 do begin
- if not Database.Find(TPEmployees[i], MyRec) then begin
- writeln('***NOT FOUND***', TPEmployees[i]);
- readln;
- end;
- end;
- finally
- Database.Free;
- end;
- readln;
- end.
-